package modelo.lugaresYPistas;


import modelo.caracteristicas.ICaracteristica;
import modelo.delictivas.ITrampa;
import modelo.policiales.Policia;
import modelo.policiales.Rango;

import org.w3c.dom.Document;
import org.w3c.dom.Node;


public abstract class Establecimiento {

	protected Pista pistaFacil;
	protected Pista pistaMedia;
	protected Pista pistaDificil;
	protected ITrampa trampa;
	protected Boolean ladronEstaEnEstablecimiento;
	protected String nombre;

	public Establecimiento(String nombre){
		this.nombre = nombre;
		this.ladronEstaEnEstablecimiento = false;
	}
	
	public Establecimiento(Pista pistaFacil, Pista pistaMedia,
			Pista pistaDificil) {
		
		this.pistaFacil = pistaFacil;
		this.pistaMedia = pistaMedia;
		this.pistaDificil = pistaDificil;
		this.ladronEstaEnEstablecimiento = false;
		
	}

	public Pista getPistaFacil() {
		return this.pistaFacil;
	}

	public Pista getPistaMedia() {
		return this.pistaMedia;
	}

	public Pista getPistaDificil() {
		return this.pistaDificil;
	}

	
	public Pista darPistaSegunRango(Rango rango) {
		return rango.obtenerPistaCorrespondienteDeEstablecimiento(this);
	}

	public boolean tienePista(){
		return ((this.pistaDificil != null) && (this.pistaMedia != null) && (this.pistaFacil != null) );
	}
	
	public void setTrampa (ITrampa unaTrampa){
		
		this.trampa = unaTrampa;
	}
	
	
	public abstract void obtenerPistaDeRastro(RastroCapital rastroCapital);
	
	
	public IRespuesta darRespuestaA(Policia policia) {
		
		if(this.ladronEstaEnEstablecimiento){
			return policia.perseguirLadron();
		}
		else if( policia.getCapitalActual().ladronEstaEnCapital() )
		{
			policia.caerEnTrampa(this.trampa);
			return this.trampa;
		}
		else
			return this.darPistaSegunRango( policia.getRango() );
	}

	public Boolean ladronSeEncuentraEnEstablecimiento(){
		return ladronEstaEnEstablecimiento;
	}
	
	public void agregarCaracteristicaAPistas(ICaracteristica unaCaracteristica) {
		this.pistaDificil.agregarCaracteristica(unaCaracteristica);
		this.pistaMedia.agregarCaracteristica(unaCaracteristica);
		this.pistaFacil.agregarCaracteristica(unaCaracteristica);
		
	}

	
	public void esconderLadronEnEstablecimiento(){
		this.ladronEstaEnEstablecimiento = true;
	}
	
	public ITrampa getTrampa(){
		
		return this.trampa;
	}

	public abstract Node serializar(Document doc);

	public String getNombre() {
		return this.nombre;
	}

	public void reiniciar() {
		
		this.trampa = null;
		this.ladronEstaEnEstablecimiento = false;
		this.pistaDificil = Pista.getPistaPorDefecto();
		this.pistaFacil = Pista.getPistaPorDefecto();
		this.pistaMedia = Pista.getPistaPorDefecto();
	}

	public void copiar(Establecimiento establecimiento) {
		this.ladronEstaEnEstablecimiento = establecimiento.ladronEstaEnEstablecimiento;
		this.pistaFacil = establecimiento.getPistaFacil();
		this.pistaMedia = establecimiento.getPistaMedia();
		this.pistaDificil = establecimiento.getPistaDificil();
		this.trampa = establecimiento.getTrampa();
		this.nombre = establecimiento.getNombre();
	}
	
}
